--- 模块功能：ftp功能测试
-- @module ftp_test
-- @author Dozingfiretruck
-- @license MIT
-- @copyright OpenLuat.com
-- @release 2020.12.08

require"ftp"
require"audio"
require"powerKey"

module(..., package.seeall)

PLAY_MODE_ORDER = 0x00;
PLAY_MODE_LIST_CYCLE = 0x01;
PLAY_MODE_SINGLE_CYCLE = 0x02;
PLAY_MODE_LIST_RAND = 0x03;

song_table = {}
song_table_rand = {}
song_cnt = 0
play_current = 1
play_mode = PLAY_MODE_ORDER
play_table = nil
play_func = nil

powerKey.setup(3000, function() rtos.poweroff() end, play_next)


audio.setChannel(1)
--挂载SD卡
io.mount(io.SDCARD)

function stop_song()
    audio.stop()
    sys.wait(1)
end

function play_song()
    audio.play(0, "FILE", "/sdcard0/"..play_table[play_current], 3, play_func)
end

function random_array(arr)
	local tmp, index
	math.randomseed(10)
	for i=1, #arr-1 do
		index = math.random(i, #arr)
		if i ~= index then
			tmp = arr[index]
			arr[index] = arr[i]
			arr[i] = tmp
		end
	end
end

function index_next()
    if play_current < song_cnt then
        play_current = play_current + 1
    else
        play_current = 1
    end
end

function index_last()
    if play_current > 1 then
        play_current = play_current - 1
    else
        play_current = song_cnt
    end
end

function play_order_bk()
    stop_song()
    if play_current < song_cnt then
        play_current = play_current + 1
        play_song()
    else
        play_current = 1
    end
end

function play_list_cycle_bk()
    stop_song()
    index_next()
    play_song()
end

function play_single_bk()
    stop_song()
    play_song()
end

function play_last()
    stop_song()
    index_last()
    play_song()
end

function play_next()
    log.info("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
    stop_song()
    index_next()
    play_song()
end

PLAY_MODE_ORDER = 0x00;
PLAY_MODE_LIST_CYCLE = 0x01;
PLAY_MODE_SINGLE_CYCLE = 0x02;
PLAY_MODE_LIST_RAND = 0x03;

local function writeOk1()
    log.info("testUart.writeOk")
end

local function writeOk2()
    log.info("testUart.writeOk")
end

local function read1()
    local data = ""
    --底层core中，串口收到数据时：
    --如果接收缓冲区为空，则会以中断方式通知Lua脚本收到了新数据；
    --如果接收缓冲器不为空，则不会通知Lua脚本
    --所以Lua脚本中收到中断读串口数据时，每次都要把接收缓冲区中的数据全部读出，这样才能保证底层core中的新数据中断上来，此read函数中的while语句中就保证了这一点
    while true do        
        data = uart.read(1,"*l")
        if not data or string.len(data) == 0 then break end
        --打开下面的打印会耗时
        log.info("testUart.read bin",data)
        log.info("testUart.read hex",data:toHex())
    end
end

local function read2()
    local data = ""
    --底层core中，串口收到数据时：
    --如果接收缓冲区为空，则会以中断方式通知Lua脚本收到了新数据；
    --如果接收缓冲器不为空，则不会通知Lua脚本
    --所以Lua脚本中收到中断读串口数据时，每次都要把接收缓冲区中的数据全部读出，这样才能保证底层core中的新数据中断上来，此read函数中的while语句中就保证了这一点
    while true do        
        data = uart.read(2,"*l")
        if not data or string.len(data) == 0 then break end
        --打开下面的打印会耗时
        log.info("testUart.read bin",data)
        log.info("testUart.read hex",data:toHex())
    end
end

function ftp_init()
    log.info("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
    log.info("ftp_login", ftp.login("PASV","175.178.158.97",21,"ftp","1")) --登录
    log.info("////////////////////////////////////////////////")
    -- log.info("ftp_command SYST", ftp.command("SYST"))--查看服务器信息
    -- log.info("ftp_list /", ftp.list("/"))--显示目录下文件
    log.info("###############################################")
    log.info("ftp_list /ftp_lib_test_down.txt", ftp.list("/uta.mp3"))--显示文件详细信息
    log.info("ftp_pwd ", ftp.pwd())--显示工作目录
    -- log.info("ftp_mkd ", ftp.mkd("/ftp_test"))--创建目录
    -- log.info("ftp_cwd ", ftp.cwd("/ftp_test"))--切换目录
    -- log.info("ftp_pwd ", ftp.pwd())--显示工作目录
    -- log.info("ftp_cdup ", ftp.cdup())--返回上级工作目录
    log.info("ftp_pwd ", ftp.pwd())--显示工作目录
    log.info("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$")

    audio.play(0, "TTS", "正在连接服务器")
    sys.wait(2000)

    if not io.exists("/sdcard0/uta.mp3") then
        io.write("/sdcard0/uta.mp3", "0")
    end

    audio.play(0, "TTS", "开始下载文件")

    --ftp.download("/uta.mp3","/sdcard0/uta.mp3")

    ftp.close()

    audio.play(0, "TTS", "下载完成，准备播放音乐")

    sys.wait(5000)
end

function sd_init()
    local sdCardTotalSize = rtos.get_fs_total_size(1,1)
    log.info("sd card total size "..sdCardTotalSize.." KB")

    --遍历读取sd卡根目录下的最多10个文件或者文件夹
    if io.opendir("/sdcard0") then
        for i = 1, 1000 do
            local fType,fName,fSize = io.readdir()
            if fType==32 then
                log.info("sd card file", fName, fSize)
                table.insert(song_table, fName)
                table.insert(song_table_rand, fName)
                song_cnt = song_cnt + 1
            elseif fType == nil then
                break
            end
        end

        io.closedir("/sdcard0")

        log.info("Song cnt: ", song_cnt)

        log.info("Song Random!")

        random_array(song_table_rand)
        for i = 1, song_cnt do
            log.info("sond: ", song_table_rand[i])
        end
    end
end

function ftp_thread()
    -- audio.play(0, "TTS", "系统正在启动")
    -- -- sys.wait(18000)
    -- sys.wait(4000)

    uart.on(1,"receive",read1)
    uart.on(1,"sent",writeOk1)
    uart.on(2,"receive",read2)
    uart.on(2,"sent",writeOk2)

    uart.setup(1,115200,8,uart.PAR_NONE,uart.STOP_1,nil,1) --必须先使用setup，并且最后一个参数是1（打开发送完成后的通知功能）
    uart.setup(2,115200,8,uart.PAR_NONE,uart.STOP_1,nil,1)
    uart.set_rs485_oe(1, pio.P2_0) --仅4G 0013版本之后支持

    uart.write(1,"hello world")
    uart.write(2,"hello leadger")

    sd_init()

    play_table = song_table
    play_func = play_list_cycle_bk
    play_song()
end

require"http"

local function cbFnc(result,prompt,head,body)
    log.info("testHttp.cbFnc",result,prompt)
    if result and head then
        for k,v in pairs(head) do
            log.info("testHttp.cbFnc",k..": "..v)
        end
    end
    if result and body then
        log.info("testHttp.cbFnc","bodyLen="..body:len())
    end
end

local function cbFncFile(result,prompt,head,filePath)
    log.info("testHttp.cbFncFile",result,prompt,filePath)
    if result and head then
        for k,v in pairs(head) do
            log.info("testHttp.cbFncFile",k..": "..v)
        end
    end
    if result and filePath then
        local size = io.fileSize(filePath)
        log.info("testHttp.cbFncFile","fileSize="..size)
        
        --输出文件内容，如果文件太大，一次性读出文件内容可能会造成内存不足，分次读出可以避免此问题
        if size<=4096 then
            log.info("testHttp.cbFncFile",io.readFile(filePath))
        else
			
        end
    end
    --文件使用完之后，如果以后不再用到，需要自行删除
    if filePath then os.remove(filePath) end
end

function http_thread()
    --http.request("GET","www.lua.org",nil,nil,nil,nil,cbFnc)
    http.request("GET","www.lua.org",nil,nil,nil,30000,cbFncFile,"download.bin")
end

sys.taskInit(http_thread)
--sys.taskInit(ftp_thread)

--卸载SD卡
--io.unmount(io.SDCARD)
